﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.Collections.ObjectModel;
using System.IO;
using ibba.src.noriskbo.ViewModels;

namespace ibba.src.noriskbo.views
{
    public partial class ViewImportacaoPortfolio : Page
    {

        const string BOTAO_CARREGAR = "BOTAO_CARREGAR";
        const string BOTAO_VALIDAR = "BOTAO_VALIDAR";
        const string BOTAO_IMPORTAR = "BOTAO_IMPORTAR";
        const string BOTAO_EXCLUIR_ERROS = "BOTAO_EXCLUIR_ERROS";
        const string BOTAO_EXPORTAR = "BOTAO_EXPORTAR";

        MainPageHelper _mainPage;
        VMImportacaoPortfolio _vmImportacaoPortfolio;

        FileInfo _filePlanilha;

        public ViewImportacaoPortfolio()
        {
            _mainPage = new MainPageHelper();
            _mainPage.BarraPesquisa.CampoPesquisaVisivel = Visibility.Collapsed;
            _mainPage.BarraMenu.ClearButtons();

            if (PerfilHelper.IsPortfolio)
            {

                InitializeComponent();

                this.Title = string.Concat(AppHelper.NomeSistema, ": Importação Portfólio");

                _vmImportacaoPortfolio = (VMImportacaoPortfolio)this.Resources["ViewModel"];
                _vmImportacaoPortfolio.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_viewModel_PropertyChanged);

                lnkDownload.NavigateUri = new Uri("/noriskbo/Data/templateCargaPortfolio.xls", UriKind.RelativeOrAbsolute);

                CarregarBotoes();
            }
            else
            {
                MessageBoxHelper.Show("Acesso negado",
                                      "Acesso negado, por favor, entrar em contato com o analista responsável pelo sistema.",
                                      "Os acessos são solicitados pelo sistema ConAcesso através do portal do ItauBBA",
                                      sl.componentes.CustomDialogEnums.enumCustomDialogButtons.OK,
                                      sl.componentes.CustomDialogEnums.enumCustomDialogIcons.Stop, null);
            }
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

        }

        /// <summary>
        /// Carrega na Main quais botoes serao utilizados nessa view
        /// </summary>
        private void CarregarBotoes()
        {
            _mainPage.BarraMenu.ClearButtons();

            _mainPage.BarraMenu.AddNewButton(BOTAO_EXPORTAR, "Exportar", Constantes.SourceImageApp.BOTAO_EXPORTAR, 0, btnExportar_Click);

            _mainPage.BarraMenu.AddNewButton(BOTAO_CARREGAR, "Carregar Arquivo", Constantes.SourceImageApp.BOTAO_CARREGAR_ARQ, 0
                                    , new sl.componentes.ControlMenuBar.Botao.DelegateClick(btnCarregar_Click));

            _mainPage.BarraMenu.AddNewButton(BOTAO_VALIDAR, "Validar Dados", Constantes.SourceImageApp.BOTAO_VALIDAR_ARQ, 0
                                    , new sl.componentes.ControlMenuBar.Botao.DelegateClick(btnValidar_Click));

            _mainPage.BarraMenu.AddNewButton(BOTAO_IMPORTAR, "Importar Dados", Constantes.SourceImageApp.BOTAO_IMPORTAR, 0
                                    , new sl.componentes.ControlMenuBar.Botao.DelegateClick(btnImportar_Click));


            //Seta visibilidade inicial dos botoes
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_CARREGAR, true);
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_VALIDAR, false);
            _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_IMPORTAR, false);
        }

        /// <summary>
        /// Metodo responsavel pelo click do botao Validar
        /// </summary>
        private void btnValidar_Click()
        {
            //Valida os portfolios do grid
            ValidarPortfolios();
        }

        /// <summary>
        /// Metodo responsavel pelo click do botao Carregar
        /// </summary>
        private void btnCarregar_Click()
        {
            //Carregar planilha
            CarregarPortfolios();
        }

        private void btnImportar_Click()
        {
            //Valida os portfolios do grid
            ImportarPortfolios();
        }

        public void btnExportar_Click()
        {
            new PageExportacaoPortfolio().Show();
        }

        /// <summary>
        /// Carrega portfolios a partir de uma planilha excel
        /// </summary>
        private void CarregarPortfolios()
        {
            OpenFileDialog dialog = new OpenFileDialog();

            //Selecao de arquivo excel para carregar os portfolios
            if (dialog.ShowDialog() == true)
                _filePlanilha = dialog.File;
            else
                _filePlanilha = null;

            //Se arquivo foi carregado, carrega os portfolios da planilha
            if (_filePlanilha != null)
                _vmImportacaoPortfolio.CarregarGridPortfoliosPlanilha(_filePlanilha);
        }

        /// <summary>
        /// Validar portfolios do grid
        /// </summary>
        private void ValidarPortfolios()
        {
            //Validar portfolios do grid antes de efetuar a importacao
            _vmImportacaoPortfolio.ValidarPortfolios();
        }

        private void ImportarPortfolios()
        {
            //Validar portfolios do grid antes de efetuar a importacao
            _vmImportacaoPortfolio.ImportarPortfolios();
        }

        /// <summary>
        /// Metodo do evento RowAdding do grid de portfolios
        /// </summary>
        /// <param name="sender">Objeto sender</param>
        /// <param name="e">Arguntos para tratar o evento</param>
        private void xgPortfolio_RowAdding(object sender, Infragistics.Controls.Grids.CancellableRowAddingEventArgs e)
        {
            //Verifica se os dados inseridos na linha podem ser efetivamente inseridos
            //Se nao forem validos, a insercao e' cancelada
            if (!_vmImportacaoPortfolio.ValidarInserirPortfolioManual(e.Row))
                e.Cancel = true;
        }

        private void xgPortfolio_RowEnteringEditMode(object sender, Infragistics.Controls.Grids.BeginEditingRowEventArgs e)
        {

        }


        /// <summary>
        /// Metodo responsavel por mudar o estado dos objetos da view quando a viewModel notifica que alguma propriedade importante foi alterada
        /// </summary>
        /// <param name="sender">Objeto sender</param>
        /// <param name="e">Argumentos contendo a propriedade que foi alterada</param>
        void _viewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (sender != null)
            {
                //Verifica se houvem alteacoes que possam mudar a visibilidade dos botoes
                if (e.PropertyName == "ValidarBotoes" ||
                    e.PropertyName == "PortfoliosCarregados" ||
                    e.PropertyName == "PortfoliosValidos")
                {
                    //Mostra botao Importar se nao existe nenhum arquivo selecionado
                    _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_CARREGAR, !_vmImportacaoPortfolio.PortfoliosCarregados);

                    //Mostra botao Validar se uma planilha foi importada ou se houve alteracoes manual nos dados da grid
                    _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_VALIDAR, (_vmImportacaoPortfolio.PortfoliosCarregados || _vmImportacaoPortfolio.NovosDados) && !_vmImportacaoPortfolio.PortfoliosValidos);

                    _mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_IMPORTAR, _vmImportacaoPortfolio.PortfoliosValidos);

                    //_mainPage.BarraMenu.AlterarVisibilidadeBotao(BOTAO_EXCLUIR_ERROS, _viewModel.HasData && _viewModel.IsValidated && _viewModel.HasError);
                }
            }

            if (e.PropertyName == "ValidacaoConcluida")
            {
                ExpandirClientesInvalidos();
            }
        }

        private void xgPortfolio_CellExitingEditMode(object sender, Infragistics.Controls.Grids.ExitEditingCellEventArgs e)
        {
            if (e.Cell.Row.Index != -1)
                _vmImportacaoPortfolio.ValidarEdicaoCelulaManual(e.Cell, e.NewValue);

            //if (e.Cell.Value == null)
            //{
            //    _vmImportacaoPortfolio.ValidarEdicaoCelulaManual(e.Cell, e.NewValue);
            //}
            //else
            //{
            //    if (e.NewValue.ToString() != e.Cell.Value.ToString())
            //        _vmImportacaoPortfolio.ValidarEdicaoCelulaManual(e.Cell, e.NewValue);
            //}
        }

        private void xgPortfolio_CellExitedEditMode(object sender, Infragistics.Controls.Grids.CellExitedEditingEventArgs e)
        {

        }

        private void xgPortfolio_RowExitingEditMode(object sender, Infragistics.Controls.Grids.ExitEditingRowEventArgs e)
        {

        }

        private void xgPortfolio_CellEnteringEditMode(object sender, Infragistics.Controls.Grids.BeginEditingCellEventArgs e)
        {
            //Se nao for a linha de insercao, nao permite editar as colunas IdISDA, CdContrato
            //Tambem verifica se a linha pode ser editada
            if (e.Cell.Row.Index != -1 &&
                (e.Cell.Column.Key == "CdContrato" ||
                e.Cell.Column.Key == "IdISDA" ||
                !_vmImportacaoPortfolio.ValidarEntrarModoEdicao(e.Cell)))
                e.Cancel = true;
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            //if (((Infragistics.Controls.Grids.Row)xgPortfolio.SelectionSettings.SelectedRows[0]).Index != -1)
            if (xgPortfolio.SelectionSettings.SelectedRows[0] != null)
            {
                //Obtem o object da linha deletada
                object objetoDeletado = ((Infragistics.Controls.Grids.Row)xgPortfolio.SelectionSettings.SelectedRows[0]).Data;
                _vmImportacaoPortfolio.ExcluirPortfolio(objetoDeletado);
            }
        }

        public void ExpandirClientesInvalidos()
        {
            foreach (Infragistics.Controls.Grids.Row row in xgPortfolio.Rows)
            {
                if (row.Columns.Where(a => a.Key == "ClientesInvalidos").Count() > 0)
                {
                    if ((bool)row.Cells["ClientesInvalidos"].Value)
                        row.IsExpanded = true;
                }
            }
        }

        private void xgPortfolio_CellEditingValidationFailed(object sender, Infragistics.Controls.Grids.CellValidationErrorEventArgs e)
        {

        }

        private void xgPortfolio_BindingValidationError(object sender, ValidationErrorEventArgs e)
        {

        }

    }
}